/**
 * 坐标轴上依次给定若干个点（均在第一象限），点向下做垂线到x轴。
 * 假定有一个人在y正半轴上向右看，求该人所在的最高高度，满足条件：无法看到所有的垂线。
 * 如果整个正半轴都能看到所有垂线，输出`-1`。
 * 类似于单调栈或者Graham凸包的循环。
 * 从左到右依次循环，如果每个点相对于都是向左转的话，那么整个正半轴都能看到。
 * 如果是直线或者向右转，就可以计算出一个高度，这个高度可以使得当前点被挡住。
 * 因此循环更新答案即可。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using Real = long double;
using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;
using i128 = __int128_t;

Real const EPS = 1E-12;
int sgn(Real x){return x >= EPS ? 1 : (x <= -EPS ? -1 : 0);}
bool is0(Real x){return 0 == sgn(x);}

struct point_t{
    Real x;
    Real y;
    point_t() = default;
    point_t(int a, int b):x(a),y(b){}
    Real cross(const point_t & A, const point_t & B)const{
        auto xoa = A.x - this->x;
        auto yoa = A.y - this->y;
        auto xob = B.x - this->x;
        auto yob = B.y - this->y;
        return xoa * yob - xob * yoa;
    }
};

const point_t Origin(0, 0);
int N;
vector<point_t> P;

Real f(const point_t & A, const point_t & B){
    return (B.y - A.y) / (A.x - B.x) * A.x + A.y;
}

void work(){
    cin >> N;
    P.assign(N + 1, {});
    for(int i=1;i<=N;++i) cin >> P[i].x >> P[i].y;

    point_t ansp(0, -1);
    Real ans = -1;
    int top = 0;
    for(int i=1;i<=N;++i){
        while(top > 0){
            auto tmp = sgn(Origin.cross(P[top - 1], P[i]));
            if(tmp > 0) top -= 1;
            else break;
        }
        P[top++] = P[i];
        if(top > 1){
            Real tmp = f(P[top - 2], P[top - 1]);
            assert(sgn(tmp) >= 0);
            if(sgn(ans + 1) == 0 or ans < tmp) ans = tmp;
        }
    }
    if(sgn(ans + 1) == 0) return (void)(cout << "-1\n");
    if(sgn(ans) == 0) ans = 0;
    cout << fixed << setprecision(12) << ans << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}